﻿using ExcellentProjectPlus.Dominio.Calificaciones.Servicios.Periodos;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Calificaciones.Periodos
{
    public class ServicioDeGestionDePeriodos : IServicioDeGestionDePeriodos
    {
        #region Propiedades
        IServicioDeAdministracionDePeriodos _servicioDeAdministracionDePeriodos;
        #endregion

        #region Constructores
        public ServicioDeGestionDePeriodos(IServicioDeAdministracionDePeriodos servicioDeAdministracionDePeriodos)
        {
            _servicioDeAdministracionDePeriodos = servicioDeAdministracionDePeriodos;
        }
        #endregion
        public IEnumerable<ExcellentProjectPlus.Dominio.Calificaciones.Entidades.Periodo> ObtenerPeriodos()
        {
            IEnumerable<Periodo> resultado = null;
            var trOptions = new TransactionOptions();
            trOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trOptions))
            {
                resultado = _servicioDeAdministracionDePeriodos.ObtenerPeriodos();
                transaccion.Complete();
            }

            return resultado;
        }

        public ExcellentProjectPlus.Dominio.Calificaciones.Entidades.Periodo ObtenerPeriodoPorId(int id)
        {
            Periodo resultado = null;
            var trOptions = new TransactionOptions();
            trOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trOptions))
            {
                resultado = _servicioDeAdministracionDePeriodos.ObtenerPeriodoPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarPeriodo(ExcellentProjectPlus.Dominio.Calificaciones.Entidades.Periodo periodo)
        {
            _servicioDeAdministracionDePeriodos.AgregarPeriodo(periodo);
        }

        public void ModificarPeriodo(ExcellentProjectPlus.Dominio.Calificaciones.Entidades.Periodo periodo)
        {
            _servicioDeAdministracionDePeriodos.ModificarPeriodo(periodo);
        }

        public void EliminarPeriodo(ExcellentProjectPlus.Dominio.Calificaciones.Entidades.Periodo periodo)
        {
            _servicioDeAdministracionDePeriodos.EliminarPeriodo(periodo);
        }

        public IEnumerable<Periodo> ObtenerPeriodosPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDePeriodos.ObtenerPeriodosPaginado(pagina, tamanio);
        }


        public Periodo ObtenerPeriodoPorIdConParciales(int id)
        {
            Periodo resultado = null;
            var trOptions = new TransactionOptions();
            trOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trOptions))
            {
                resultado = _servicioDeAdministracionDePeriodos.ObtenerPeriodoPorIdConParciales(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public List<Periodo> ObtenerPeriodosVigentes()
        {
            return _servicioDeAdministracionDePeriodos.ObtenerPeriodosVigentes();
        }
    }
}
